﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autocentro.Respository;
using Autocentro.Entities;
using Microsoft.Practices.Unity;

namespace Autocentro.BussinesLogic
{
    public class CompraBL : ICompraBL
    {
        [Dependency]
        public ICompraRepository CompraRepository { get; set; }

        [Dependency]
        public IDetalleCompraRepository DetCompraRepository { get; set; }
        
        [Dependency]
        public IProductoRepository ProductoRepository { get; set; }

        public List<COMPRAS> GetAllFromComprasByCriterio(string criterio)
        {
            return CompraRepository.GetFromVentasByCriterio(criterio);
        }

        public COMPRAS GetFromCompraById(int id)
        {
            return CompraRepository.GetFromCompraById(id);
        }

        public void AddCompra(COMPRAS compra)
        {
            var msg = "";
            var ok = compra.Validate(out msg);
            if (ok)
            {
                CompraRepository.AddCompra(compra);

                #region UpdateStock
                foreach (var item in compra.DetalleCompra)
                {
                    var _producto = ProductoRepository.GetFromProductoByID(item.IdProducto);
                    _producto.Stock =_producto.Stock + item.Cantidad;
                    ProductoRepository.UpdateProducto(_producto);
                }
                #endregion
            }
            else
            {
                throw new Exception(msg);
            }
            
        }

        public void UpdateCompra(COMPRAS compra)
        {
            var msg = "";
            var ok = compra.Validate(out msg);
            if (ok)
            {
                #region UpdateProductos

                foreach (var item in compra.DetalleCompra)
                {
                    var existeDetal = DetCompraRepository.GetFromDetalleCompraByCompraId(item.IdProducto, compra.Id);
                    if (existeDetal != null)
                    {
                        if (item.Cantidad != existeDetal.Cantidad)
                        {
                            var producto = ProductoRepository.GetFromProductoByID(item.IdProducto);
                            producto.Stock = producto.Stock - existeDetal.Cantidad + item.Cantidad;
                            ProductoRepository.UpdateProducto(producto);
                        }
                    }
                    else
                    {
                        var producto = ProductoRepository.GetFromProductoByID(item.IdProducto);
                        producto.Stock = producto.Stock + item.Cantidad;
                        ProductoRepository.UpdateProducto(producto);
                    }
                }
                #endregion
                
                CompraRepository.UpdateCompra(compra);
            }
            else
            {
                throw new Exception(msg);
            }
        }

        public void RemoveCompra(int id)
        {
            CompraRepository.RemoveCompra(id);
        }

        public List<COMPRAS> GetallFromCompras()
        {
            return CompraRepository.GetallFromCompras();
        }


        public List<COMPRAS> GetFromComprasbyFechasAndProveedor(DateTime? fec1, DateTime? fec2, string proveedor)
        {
            return CompraRepository.GetFromComprasbyFechasAndProveedor(fec1, fec2, proveedor);
        }
    }
}
